#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
中间件模块

定义全局中间件，处理请求/响应和异常
"""

from functools import wraps
from flask import Flask, request, g, jsonify
import time
import traceback

from app.core.exceptions import AppException
from app.utils.api_response import ApiResponse


def init_middleware(app: Flask):
    """初始化应用中间件
    
    Args:
        app: Flask应用实例
    """
    # 注册异常处理
    register_exception_handlers(app)
    
    # 注册请求/响应中间件
    register_request_handlers(app)


def register_exception_handlers(app: Flask):
    """注册异常处理器
    
    Args:
        app: Flask应用实例
    """
    @app.errorhandler(AppException)
    def handle_app_exception(error):
        """处理应用自定义异常"""
        response = ApiResponse.error(
            message=error.message,
            code=error.code,
            data=getattr(error, 'errors', None)
        )
        return response
    
    @app.errorhandler(Exception)
    def handle_generic_exception(error):
        """处理通用异常"""
        # 在开发环境下输出详细错误
        if app.config.get('DEBUG', False):
            traceback_str = ''.join(traceback.format_exception(
                etype=type(error), value=error, tb=error.__traceback__
            ))
            app.logger.error(f"Unhandled exception: {traceback_str}")
            
            # 在开发环境下返回详细错误信息
            return ApiResponse.error(
                message=str(error),
                code=500,
                data={"traceback": traceback_str}
            )
        
        # 在生产环境下返回通用错误
        return ApiResponse.error(
            message="服务器内部错误",
            code=500
        )


def register_request_handlers(app: Flask):
    """注册请求/响应处理器
    
    Args:
        app: Flask应用实例
    """
    @app.before_request
    def before_request():
        """请求处理前的操作"""
        # 记录请求开始时间，用于计算请求处理时间
        g.start_time = time.time()
        
        # 记录请求信息
        if app.config.get('DEBUG', False):
            app.logger.debug(f"Request: {request.method} {request.path}")
            if request.is_json:
                app.logger.debug(f"Request JSON: {request.get_json()}")
    
    @app.after_request
    def after_request(response):
        """请求处理后的操作"""
        # 添加跨域支持
        response.headers.add('Access-Control-Allow-Origin', '*')
        response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization,token')
        response.headers.add('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS')
        
        # 记录请求处理时间
        if hasattr(g, 'start_time'):
            elapsed = time.time() - g.start_time
            response.headers.add('X-Response-Time', f"{elapsed * 1000:.2f}ms")
            
            if app.config.get('DEBUG', False) and elapsed > 0.5:  # 如果响应时间超过500ms，记录慢请求
                app.logger.warning(f"Slow request: {request.method} {request.path} - {elapsed:.2f}s")
        
        return response 